/**
 * DialogueBD.java    01/02/2012
 */

package l3.info.Projet;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * Classe utilitaire permettant de faire différentes
 * opérations sur une base de données
 * @author Loic Martinez
 * @version 1.0
 */

public class DialogueBD {

	/**
	 * Permet de se connecter à une base de données postgresql
	 * @param url, l'url de la base de données
	 * @param user, l'utilisateur de la base de données
	 * @param passwd, le mot de passe de l'utilisateur
	 * @return conn, la connexion à la base de données
	 */
	public static Connection connexionSQL(String url, String user, String passwd) {
		Connection conn = null;

		try {
			Class.forName("org.postgresql.Driver");
			conn = DriverManager.getConnection(url, user, passwd);
		} catch (Exception e) {
			System.err.println("Erreur de connexion à la base de données !");
		}

		return conn;
	}

	/**
	 * Ramène les résultats de la requête requete par la connexion conn
	 * @param conn, la connexion utilisée
	 * @param requete, la requête à exécuter
	 * @return listNuplets, une List contenant autant d'ArrayList que
	 * que de n-uplets ramenés
	 */
	/*
	public static List<List<Object>> getData(Connection conn, String requete) {
		// Contient toutes les lignes (listValues)
		List<List<Object>> listNuplets = new ArrayList<List<Object>>();

		try {
			// Exécution de la requête
			Statement state = conn.createStatement();
			ResultSet result = state.executeQuery(requete);
			ResultSetMetaData resultMeta = result.getMetaData();

			// Tant qu'on trouve des n-uplets
			while (result.next()) {
				Toto inst = new Toto();
				inst.setUserName(result.getString("name"));
				inst.setDateNaissance(result.getDate("date_naissance"));
				List<Object> listValues = new ArrayList<Object>();
				
				// On récupère la valeur de chaque colonner
				for (int i = 1; i <=  resultMeta.getColumnCount(); i++) {
					// On ajoute la valeur associée à la colonne
					listValues.add(result.getString(i));
					
					Date ma_date = result.getDate(i);
				}
				
				// On ajoute la ligne à la List final
				listNuplets.add(listValues);
			}

			result.close();
			state.close();
			
		} catch (Exception e) {
			System.err.println("Erreur lors de la récupération des données !");
		}
		return listNuplets;
	}
	*/
	public static List<Users> getDataFromUserTable(Connection conn, String requete) {
		// Contient toutes les lignes (listValues)
		List<Users> listUser = new ArrayList<Users>();

		try {
			// Exécution de la requête
			Statement state = conn.createStatement();
			ResultSet result = state.executeQuery(requete);

			// Tant qu'on trouve des n-uplets
			while (result.next()) {
				Users inst = new Users(
						result.getString("name"),
						result.getDate("date_naissance"));
				
				// On ajoute la ligne à la List final
				listUser.add(inst);
			}

			result.close();
			state.close();
			
		} catch (Exception e) {
			System.err.println("Erreur lors de la récupération des données !");
		}
		return listUser;
	}
	
	public static void main(String[] args) {
		Connection conn = connexionSQL("jdbc:postgresql://localhost/projet_java", "loic", "password");
		/*List<List<Object>> list = getData(conn, "SELECT * FROM Utilisateur");
		for (List<Object> o : list) {
			for (Object o1 : o) {
				System.out.println("in main:"+o1.toString());
			}
		}*/
	}
}
